﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace DatabaseManager.WinForms.Services
{
    public static class ModelGenerationHelper
    {
        /// <summary>
        /// 清理生成的Model类中C#8.0的可为null引用类型语法（适配C#7.3）
        /// 移除：
        /// 1. 类型后的问号（如 string? → string）
        /// 2. 初始化赋值的 = null!（如 public string Name { get; set; } = null!; → public string Name { get; set; };）
        /// </summary>
        /// <param name="outputDir">Model类所在目录</param>
        public static void CleanNullableSyntax(string outputDir)
        {
            if (!Directory.Exists(outputDir))
            {
                throw new DirectoryNotFoundException($"目录不存在：{outputDir}");
            }

            // 遍历所有生成的.cs文件
            foreach (var filePath in Directory.GetFiles(outputDir, "*.cs", SearchOption.AllDirectories))
            {
                try
                {
                    // 读取文件内容
                    string content = File.ReadAllText(filePath);

                    // 1. 移除类型后的问号（如 string? → string，int? → int）
                    // 正则匹配："类型? "（如 "string? "、"int? "），替换为"类型 "
                    content = Regex.Replace(content, @"(\w+)\?(\s+)", "$1$2");

                    // 2. 移除 = null! 初始化（如 = null!; → ;）
                    content = content.Replace(" = null!;", "");

                    // 3. 处理可能的空格差异（如 = null! ; → ;）
                    content = content.Replace(" = null! ;", "");

                    // 保存修改后的内容
                    File.WriteAllText(filePath, content);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"清理文件 {filePath} 失败：{ex.Message}");
                }
            }

            Console.WriteLine($"已完成 {outputDir} 目录下的Model类语法清理（适配C#7.3）");
        }


        /// <summary>
        /// 处理命名空间和输出目录
        /// </summary>
        /// <param name="namespaceInput">用户输入的命名空间</param>
        /// <param name="baseOutputDirInput">用户输入的基础输出目录</param>
        /// <param name="defaultBaseDir">当基础输出目录为空时使用的默认路径</param>
        /// <returns>包含处理后的命名空间和最终输出目录的元组</returns>
        public static (string processedNamespace, string processedOutputDir) ProcessNamespaceAndOutputDir(
            string namespaceInput,
            string baseOutputDirInput,
            string defaultBaseDir = null)
        {
            // 处理命名空间（为空时使用默认值"Models"）
            string processedNamespace = string.IsNullOrWhiteSpace(namespaceInput)
                ? "Models"
                : namespaceInput.Trim();

            // 处理基础输出目录
            string baseOutputDir = baseOutputDirInput?.Trim();
            if (string.IsNullOrWhiteSpace(baseOutputDir))
            {
                // 使用提供的默认目录或应用程序目录
                baseOutputDir = string.IsNullOrWhiteSpace(defaultBaseDir)
                    ? Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "GeneratedModels")
                    : defaultBaseDir;
            }

            // 拼接最终输出目录（基础目录 + 命名空间）
            string processedOutputDir = Path.Combine(baseOutputDir, processedNamespace);

            // 确保目录存在
            if (!Directory.Exists(processedOutputDir))
            {
                Directory.CreateDirectory(processedOutputDir);
            }

            return (processedNamespace, processedOutputDir);
        }
    }
}
